package com.forum.module.system.service.user;

import com.baomidou.mybatisplus.extension.service.IService;
import com.forum.framework.common.pojo.PageResult;
import com.forum.module.system.controller.admin.auth.vo.AuthRegisterReqVO;
import com.forum.module.system.controller.admin.auth.vo.AuthRegisterRespVO;
import com.forum.module.system.controller.admin.user.vo.user.ForgotPasswordReqVO;
import com.forum.module.system.controller.admin.user.vo.user.UserPageReqVO;
import com.forum.module.system.controller.admin.user.vo.user.UserSaveReqVO;
import com.forum.module.system.controller.admin.user.vo.user.UserUpdatePasswordReqVO;
import com.forum.module.system.dal.dataobject.user.UserDO;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;

import java.util.List;

/**
 * 后台用户 Service 接口
 *
 * @author zihan.ouyang
 */
public interface UserService extends IService<UserDO> {
    /**
     * 创建用户
     *
     * @param createReqVO 用户信息
     * @return 用户编号
     */
    Long createUser(@Valid UserSaveReqVO createReqVO);

    UserDO getUserByUsername(String username);

    UserDO getUser(Long userId);

    /**
     * 密码是否匹配
     *
     * @param rawPassword     未加密密码
     * @param encodedPassword 已加密密码
     * @return 是否匹配
     */
    boolean isPasswordMatch(String rawPassword, String encodedPassword);

    /**
     * 注册用户
     *
     * @param reqVO 注册信息
     * @return 注册用户编号
     */
    Long registerUser(AuthRegisterReqVO reqVO);

    /**
     * 更新用户信息
     *
     * @param reqVO 更新信息
     */
    void updateUser(UserSaveReqVO reqVO);

    /**
     * 修改密码
     * @param reqVO 修改密码请求体
     */
    void updateUserPassword(UserUpdatePasswordReqVO reqVO, HttpServletRequest request);

    /**
     * 更新用户状态
     *
     * @param id     用户编号
     * @param status 状态
     */
    void updateUserStatus(Long id, Integer status);

    /**
     * 删除用户
     *
     * @param id 用户编号
     */
    void deleteById(Long id);

    /**
     * 分页查询用户列表
     *
     * @param pageReqVO 查询条件
     * @return 用户列表
     */
    PageResult<UserDO> getUserPage(@Valid UserPageReqVO pageReqVO);

    /**
     * 根据状态查询用户列表
     *
     * @param status 状态
     * @return 用户列表
     */
    List<UserDO> getUserListByStatus(Integer status);

    /**
     * 更新用户登录信息
     *
     * @param userId   用户编号
     * @param clientIP 用户 IP
     */
    void updateUserLogin(Long userId, String clientIP);

    void forgotUserPassword(ForgotPasswordReqVO reqVO, HttpServletRequest request);
}
